package com.shujia.network.tcp;

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

// 客户端发送文本内容给服务端，服务端将内容打印到控制台上。
// 使用字符流实现
public class TcpTest4 {

    @Test
    public void client() throws IOException {
        // 指定ip地址和端口号
        Socket s = new Socket(InetAddress.getLocalHost(), 6666);
        BufferedWriter bw = new BufferedWriter(
                new OutputStreamWriter(s.getOutputStream()));

        // 键盘录入
        // 支持循环写入数据, 如果写入的exit, 结束写入
        Scanner sc = new Scanner(System.in);
        while (true) {
            String msg = sc.next();
            // 因为使用的是缓冲流, 每次写入的数据在缓冲数组里,需要手动调用flush
            bw.write(msg);
            bw.newLine();
            bw.flush();
            if ("exit".equals(msg)) {
                break;
            }
        }

        bw.close();// 关闭输出流, 表示数据写入Socket完成
        sc.close();
        s.close();
    }


    // 客户端发送文件给服务端，服务端将文件保存在本地。
    @Test
    public void server() throws IOException {
        // 监听本机指定端口
        ServerSocket ss = new ServerSocket(6666);

        // 阻塞获取客户端的连接
        Socket s = ss.accept();

        // 读取文件到内存
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

        while (true) {
            // 读的是一行数组, 要有换行才能是一行数据
            String msg = br.readLine();
            System.out.println(msg);
            if ("exit".equals(msg)) {
                break;
            }
        }

        // 关闭资源
        br.close();
        s.close();
        ss.close();
    }
}
